<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var findIntegers = function (n) {
      // fib是指当二进制数有i位时有多少个符合题意的数，temp主要用于处理连续出现两个1的情况
      let fib = [1, 2],
        nStr = n.toString(2),
        temp = '2',
        ans = 0;
      let lenN = nStr.length;
      // 构建有i位时的不含连续11的数字总和，而总和数组一样
      for (let i = 2; i <= lenN; i++) {
        fib.push(fib[i - 1] + fib[i - 2]);
      }
      // 对于n位是1的，实际只要计算n-1位拥有的总数，以及剩余的零头拥有的总数。
      for (const c of nStr) {
        lenN -= 1;
        if (c !== '0') {
          ans += fib[lenN];
          if (c === temp) {
            break;
          }
        }
        temp = c;
        // 当遍历到最后时，此时会漏算自己，需要加1（不能在循环外加
        // ，否则对于11这个二进制不正确，这个数也会使lenN置为0，但自身不满足条件）
        if (lenN === 0) {
          ans += 1;
        }
      }
      return ans
    };
    console.log(findIntegers(1))
  </script>
</body>

</html>